Part 1: The story of inaugural speeches of Democratic Party and Republican Party
It is well known that Democrats and republicans have different platforms, development goals and different interests. So what are the similarities and differences of their speeches?
1.1 The change of number of words over time


According to the barplot above, we may see that:
For Democratic presidents’ speeches:
(1) Most of the speeches are under 4000 words.
(2) The number of words fluctuate over time.
(3) As time goes by, there is a slight trend that their speeches contain more and more words.
For Republican presidents’ speeches:
(1) Most of the speeches are under 5000 words.
(2) The number of words fluctuate over time.
(3) As time goes by, there is a slight trend that their speeches contain more and more words.
It seems like that the word average number of Republican presidents’ speeches is more than that of Democratic presidents’ speeches. Is it right?

According to the graph above, we can see that the average word number of Democratic presidents’ speeches is about 3000. As for Republican presidents’ speeches, it is about 3500. So we have the right guess.
1.2 Overview of sentence length distribution by different Party of speeches
For simpler visualization, we chose a subset of better known presidents or presidential candidates on which to focus our analysis.
[1] "DonaldJTrump" "JohnMcCain" "GeorgeBush" "MittRomney"
[5] "GeorgeWBush" "RonaldReagan" "AlbertGore,Jr" "HillaryClinton"
[9] "JohnFKerry" "WilliamJClinton" "HarrySTruman" "BarackObama"
[13] "LyndonBJohnson" "GeraldRFord" "JimmyCarter" "DwightDEisenhower"
[17] "FranklinDRoosevelt" "HerbertHoover" "JohnFKennedy" "RichardNixon"
[21] "WoodrowWilson" "AbrahamLincoln" "TheodoreRoosevelt" "JamesGarfield"
[25] "JohnQuincyAdams" "UlyssesSGrant" "ThomasJefferson" "GeorgeWashington"
[29] "WilliamHowardTaft" "AndrewJackson" "WilliamHenryHarrison" "JohnAdams"
These are the presidnets we chose.
For relevant to Trump’s speeches, we will only compare speeches for the first terms of former U.S. presidents.
1.2.1 Democratic

We may notice that most of their sentences are between 1 and 30 words. The distribution of number of words in a sentence is relatively smooth and average.
1.2.2 Republican

As for Republican presidents, we find that they have more sentences under 20 words. So most of their points concentrate on the left side of the graph.
1.3 Clustering of emotions

By clustering of emotions of all these chosen speeches from different Party, we can see that:
(1) The speeches from different Party may be in the same emotion cluster, like William Howard Taft and BarackObama.
(2) The speeches from the same Party may be in different emotion cluster, like Franklin D. Roosevelt and BarackObama.
With all the finding we conclude from part 1, next we will focus on the difference of speeches between DonaldJTrump and BarackObama.
Part 2: The story of inaugural speeches of DonaldJTrump and BarackObama
Generally speaking, there are lots of differences between DonaldJTrump and BarackObama, ages, Parties, experience and so on. How about their inaugural speeches?
2.1 Overview of sentence length distribution
It is obvious that DonaldJTrump has more short sentences than BarackObama. BarackObama has lots of sentences with more than 25 words.
So will the number of words be different?

According to the barplot above, we can find that the speeches of DonaldJTrump has about 4300 words. However, the speeches of BarackObama has about 3600 words, which is much less than DonaldJTrump.
2.2 DonaldJTrump VS BarackObama, what are their short sentences?
We will notice that most of their short sentences are similar, like ‘Thank you’. The ‘America first’ in Trump’s speech and the ‘diversity and openness’ in Obama’s speech show a big difference in their concept of running a country, especially its external attitude.
2.3 Sentiment analsis
The following analysis shows that sentence length variation over the course of the speech, with emotions. How the presidents alternate between long and short sentences and how they shift between different sentiments in their speeches. We use the same color to show the same emotion.
2.3.1 DonaldJTrump VS BarackObama

It is obvious that the emotion of Trump’s sentences are more easily changed. On contract, the emotion of Obama’s sentences are more coherence.
What are the emotionally charged sentences?
[1] "Donald Trump"
[1] "No challenge can match the heart and fight and spirit of America."
[2] "God bless you, and God bless America."
[3] "America will start winning again, winning like never before."
[4] "No challenge can match the heart and fight and spirit of America."
[5] "Today's ceremony, however, has very special meaning."
[6] "America will start winning again, winning like never before."
[7] "Today's ceremony, however, has very special meaning."
[8] "God bless you, and God bless America."
[1] "Barack Obama"
[1] "On this day, we gather because we have chosen hope over fear, unity of purpose over conflict and discord."
[2] "This is the journey we continue today."
[3] "We remain the most prosperous, powerful nation on Earth."
[4] "Our Nation is at war against a far-reaching network of violence and hatred."
[5] "We remain the most prosperous, powerful nation on Earth."
[6] "Our Nation is at war against a far-reaching network of violence and hatred."
[7] "This is the meaning of our liberty and our creed;"
[8] "God bless you, and God bless the United States of America."
From the result above, we may find that the change of emotion is kind of related to the change of topics, like ‘Today’s ceremony, however, has very special meaning.’ by Trump.
2.4 Topic modeling
For topic modeling, we prepare a corpus of sentence snipets as follows. For each speech, we start with sentences and prepare a snipet with a given sentence with the flanking sentences.
Based on the most popular terms and the most salient terms for each topic, we assign a hashtag to each topic. These topics are “Economy”, “America”, “Defense”, “Belief”, “Election”, “Patriotism”, “Unity”, “Government”, “Reform”, “Temporal”, “WorkingFamilies”, “Freedom”, “Equality”, “Misc” and “Legislation”.
The unemployed miners and textile workers will know how to vote. The old people without medical care--the families without a decent home--the parents of children without adequate food or schools--they all know that it's time for a change. But I think the American people expect more from us than cries of indignation and attack.
thus we have held that the federal government should in the presence of great national danger use its powers to give leadership to the initiative, the courage, and the fortitude of the people themselves, but that it must insist upon individual, community, and state responsibility. that it should furnish leadership to assure the coordination and unity of great existing agencies, governmental and private, for economic and humanitarian action. that where it becomes necessary to meet emergencies beyond the power of these agencies by the creation of new governmental instrumentalities, that they should be of such character as not to supplant or weaken, but rather to supplement and strengthen, the initiative and enterprise of our people.
a difference of opinion has arisen in regard to the point of time when the people of a territory shall decide this question for themselves this is happily a matter of but little practical importance besides it is a judicial question which legitimately belongs to the supreme court of the united states before whom it is now pending and will it is understood be speedily and finally settled
and to anyone who believes that restraint honor and trust in the people cannot be returned to government i say follow me follow me only right conduct only right conduct distinguishes a great nation from one that cannot rise above itself it has never been otherwise
past years men women proudly bravely wear uniforms u s armed services called upon go harms way discharged duty honor professionalism
universities culture envy world thats keeps world coming shores instead american spirit – american promise – pushes us forward even path uncertain binds us together spite differences
old thing grown familiar begun creep habit thought live alter aspect latter look critic upon fresh awaken eye drop disguis shown alien sinist new thing look frank upon will comprehend real charact come assum aspect thing long believ familiar stuff convict
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1691 2143 1761 1953 2049 1162 1262 1073 1298 1188 912 1609 1315 993 572
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "product" "trade" "tariff" "market" "agricultur" "per" "taxat"
[2,] "educ" "teacher" "doubl" "medicar" "medic" "doctor" "clean"
[3,] "corner" "golden" "imag" "godgiven" "churchil" "twentieth" "stretch"
[4,] "john" "reagan" "speech" "chairman" "truman" "gore" "harri"
[5,] "think" "lot" "got" "sit" "youv" "tire" "horribl"
[6,] "respons" "technolog" "planet" "climat" "gas" "discov" "reaction"
[7,] "state" "perpetu" "despot" "sphere" "agit" "apprehens" "latter"
[8,] "knowledg" "mental" "piti" "dignifi" "pretend" "quarrel" "exil"
[9,] "discharg" "virtu" "render" "cultiv" "conscious" "station" "bestow"
[10,] "case" "court" "recommend" "receiv" "appoint" "commiss" "approv"
[11,] "choic" "argument" "elector" "wilson" "logic" "alabama" "rancor"
[12,] "defens" "arm" "nuclear" "navi" "vietnam" "aggress" "terror"
[13,] "aspir" "hate" "worthi" "brother" "storm" "star" "miseri"
[14,] "five" "grown" "catch" "sixti" "summer" "overstay" "entri"
[15,] "neglect" "appeas" "graviti" "forgiv" "junctur" "impend" "bloat"
Topic 1 Topic 2 Topic 3 Topic 4 Topic 5 Topic 6 Topic 7 Topic 8
[1,] "busi" "work" "american" "presid" "know" "must" "govern" "nation"
[2,] "increas" "famili" "america" "day" "want" "new" "state" "right"
[3,] "industri" "job" "let" "friend" "just" "can" "power" "peopl"
[4,] "product" "help" "live" "man" "thing" "chang" "unit" "free"
[5,] "system" "tax" "futur" "thank" "well" "need" "union" "men"
[6,] "upon" "children" "see" "offic" "say" "respons" "constitut" "citizen"
[7,] "labor" "care" "ask" "accept" "like" "econom" "general" "equal"
[8,] "trade" "economi" "promis" "proud" "think" "great" "interest" "justic"
[9,] "public" "pay" "better" "convent" "way" "problem" "form" "life"
[10,] "import" "school" "togeth" "said" "dont" "meet" "principl" "secur"
[11,] "polici" "valu" "world" "hous" "get" "home" "limit" "among"
[12,] "use" "home" "today" "first" "back" "face" "whole" "civil"
[13,] "protect" "educ" "peopl" "word" "that" "old" "feder" "individu"
[14,] "tariff" "creat" "build" "great" "tell" "opportun" "part" "women"
[15,] "develop" "save" "look" "tonight" "ive" "time" "becom" "full"
[16,] "revenu" "make" "tonight" "senat" "put" "fail" "preserv" "without"
[17,] "market" "mean" "come" "side" "good" "leadership" "within" "progress"
[18,] "benefit" "plan" "centuri" "next" "even" "way" "citizen" "everi"
[19,] "price" "health" "stand" "unit" "talk" "energi" "institut" "human"
[20,] "larg" "need" "say" "win" "someth" "turn" "local" "moral"
Topic 9 Topic 10 Topic 11 Topic 12 Topic 13 Topic 14 Topic 15
[1,] "may" "law" "parti" "world" "freedom" "year" "will"
[2,] "shall" "congress" "peopl" "peac" "hope" "time" "everi"
[3,] "duti" "execut" "one" "nation" "faith" "now" "can"
[4,] "public" "administr" "republican" "war" "call" "countri" "make"
[5,] "upon" "may" "polit" "forc" "god" "one" "countri"
[6,] "countri" "without" "made" "polici" "purpos" "last" "believ"
[7,] "servic" "shall" "democrat" "strength" "caus" "mani" "never"
[8,] "trust" "act" "differ" "defens" "yet" "first" "good"
[9,] "confid" "effect" "elect" "militari" "peopl" "histori" "alway"
[10,] "great" "legisl" "great" "arm" "love" "ever" "take"
[11,] "honor" "constitut" "question" "strong" "spirit" "end" "give"
[12,] "patriot" "order" "person" "use" "great" "million" "now"
[13,] "best" "subject" "decis" "danger" "heart" "much" "support"
[14,] "interest" "enforc" "fact" "also" "land" "still" "serv"
[15,] "experi" "made" "choic" "secur" "speak" "sinc" "lead"
[16,] "high" "practic" "vote" "intern" "fear" "past" "pledg"
[17,] "present" "secur" "truth" "nuclear" "human" "administr" "whether"
[18,] "spirit" "respect" "mani" "europ" "liberti" "ago" "sure"
[19,] "part" "pass" "two" "maintain" "ideal" "four" "continu"
[20,] "promot" "rule" "now" "threaten" "life" "immigr" "place"
2.4.1 Topics differences between Trump and Obama
[1] "Economy" "America" "Defense" "Belief" "Election"
[6] "Patriotism" "Unity" "Government" "Reform" "Temporal"
[11] "WorkingFamilies" "Freedom" "Equality" "Misc" "Legislation"
[1] 0.04189455 0.08378911 0.12568366 0.16757822 0.20947277 0.25136733 0.29326188 0.33515644
[9] 0.37705099 0.41894555 0.46084010 0.50273466 0.54462921 0.58652377 0.62841832
[1] 0.04247576 0.08495153 0.12742729 0.16990306 0.21237882 0.25485459 0.29733035 0.33980612
[9] 0.38228188 0.42475765 0.46723341 0.50970917 0.55218494 0.59466070 0.63713647

According to the result, we may find that:
(1) For DonaldJTrump, a big part of his speech is related to legislation, equality, defense and America.
(1) For BarackObama, it is equality, freedom, government and America.
Conclusion
In conclusion, from these analysis, we may find a lot of differences between the inaugural speech of Democratic Party and Republican Party, including the number of words, sentence distribution, emotion cluster and so on.
So as to DonaldJTrump from Republican Party and BarackObama from Democratic Party, they have lots of differences in their speech’s pattern, like sentiment difference, topic difference and so on.
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgcHJlc2lkZW50aWFsIGluYXVndXJhbCBzcGVlY2hlcyAtIGJhc2VkIG9uIFBhcnR5IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIEludHJvZHVjdGlvbgoKIyMjIEluYXVndXJhbCBzcGVlY2ggaXMgbm90IG9ubHkgdGhlIHRoZSBmaXJzdCBvZmZpY2lhbCBzcGVlY2ggb2YgYW55IHByZXNpZGVudCBvZiBVbml0ZWQgU3RhdGVzLCBidXQgYWxzbyByZWZsZWN0cyB0aGUgcGVyc29uYWxpdHksIHNlbnRpbWVudCwgaW50ZXJlc3RlZCB0b3BpY3MgZm9yIHRoZSBuZXh0IGZldyB5ZWFycyBhbmQgc28gb24uIFRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgbWFpbmx5IGZvY3VzIG9uIHRoZSBkaWZmZXJlbmNlIG9mIGluYXVndXJhbCBzcGVlY2hlcyBiZXR3ZWVuIERlbW9jcmF0aWMgUGFydHkgYW5kIFJlcHVibGljYW4gUGFydHkocGFydCAxKS4gVGhlbiwgd2UgY29tcGFyZSB0aGUgaW5hdWd1cmFsIHNwZWVjaGVzIG9mIERvbmFsZEpUcnVtcCBhbmQgQmFyYWNrT2JhbWEocGFydCAyKS4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQojIGNoZWNrIGFuZCBpbnN0YWxsIG5lZWRlZCBwYWNrYWdlcy4gTG9hZCB0aGUgbGlicmFyaWVzIGFuZCBmdW5jdGlvbnMuIAoKcGFja2FnZXMudXNlZD1jKCJydmVzdCIsICJ0aWJibGUiLCAicWRhcCIsIAogICAgICAgICAgICAgICAgInNlbnRpbWVudHIiLCAiZ3Bsb3RzIiwgImRwbHlyIiwKICAgICAgICAgICAgICAgICJ0bSIsICJzeXV6aGV0IiwgImZhY3RvZXh0cmEiLCAKICAgICAgICAgICAgICAgICJiZWVzd2FybSIsICJzY2FsZXMiLCAiUkNvbG9yQnJld2VyIiwKICAgICAgICAgICAgICAgICJSQU5OIiwgInRtIiwgInRvcGljbW9kZWxzIikKCiMgY2hlY2sgcGFja2FnZXMgdGhhdCBuZWVkIHRvIGJlIGluc3RhbGxlZC4KcGFja2FnZXMubmVlZGVkPXNldGRpZmYocGFja2FnZXMudXNlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdChpbnN0YWxsZWQucGFja2FnZXMoKVssMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMudXNlZCkpCiMgaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzCmlmKGxlbmd0aChwYWNrYWdlcy5uZWVkZWQpPjApewogIGluc3RhbGwucGFja2FnZXMocGFja2FnZXMubmVlZGVkLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQp9CgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSgicnZlc3QiKQpsaWJyYXJ5KCJ0aWJibGUiKQojIFlvdSBtYXkgbmVlZCB0byBydW4KIyBzdWRvIGxuIC1mIC1zICQoL3Vzci9saWJleGVjL2phdmFfaG9tZSkvanJlL2xpYi9zZXJ2ZXIvbGlianZtLmR5bGliIC91c3IvbG9jYWwvbGliCiMgaW4gb3JkZXIgdG8gbG9hZCBxZGFwCmxpYnJhcnkoInFkYXAiKQpsaWJyYXJ5KCJzZW50aW1lbnRyIikKbGlicmFyeSgiZ3Bsb3RzIikKbGlicmFyeSgiZHBseXIiKQpsaWJyYXJ5KCJ0bSIpCmxpYnJhcnkoInN5dXpoZXQiKQpsaWJyYXJ5KCJmYWN0b2V4dHJhIikKbGlicmFyeSgiYmVlc3dhcm0iKQpsaWJyYXJ5KCJzY2FsZXMiKQpsaWJyYXJ5KCJSQ29sb3JCcmV3ZXIiKQpsaWJyYXJ5KCJSQU5OIikKbGlicmFyeSgidG0iKQpsaWJyYXJ5KCJ0b3BpY21vZGVscyIpCgpzb3VyY2UoIi4uL2xpYi9wbG90c3RhY2tlZC5SIikKc291cmNlKCIuLi9saWIvc3BlZWNoRnVuY3MuUiIpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFfQojIGNvbnN0cnVjdCB0aGUgZGF0YXNldAoKIyMjIEluYXVndWFyYWwgc3BlZWNoZXMKbWFpbi5wYWdlIDwtIHJlYWRfaHRtbCh4ID0gImh0dHA6Ly93d3cucHJlc2lkZW5jeS51Y3NiLmVkdS9pbmF1Z3VyYWxzLnBocCIpCiMgR2V0IGxpbmsgVVJMcwojIGYuc3BlZWNobGlua3MgaXMgYSBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBsaW5rcyBmcm9tIHRoZSBsaXN0IG9mIHNwZWVjaGVzLiAKaW5hdWc9Zi5zcGVlY2hsaW5rcyhtYWluLnBhZ2UpCmFzLkRhdGUoaW5hdWdbLDFdLCBmb3JtYXQ9IiVCICVlLCAlWSIpCmluYXVnPWluYXVnWy1ucm93KGluYXVnKSxdICMgcmVtb3ZlIHRoZSBsYXN0IGxpbmUsIGlycmVsZXZhbnQgZHVlIHRvIGVycm9yLgoKIyMjIyBOb21pbmF0aW9uIHNwZWVjaGVzCm1haW4ucGFnZT1yZWFkX2h0bWwoImh0dHA6Ly93d3cucHJlc2lkZW5jeS51Y3NiLmVkdS9ub21pbmF0aW9uLnBocCIpCiMgR2V0IGxpbmsgVVJMcwpub21pbiA8LSBmLnNwZWVjaGxpbmtzKG1haW4ucGFnZSkKIyMjIyBGYXJld2VsbCBzcGVlY2hlcwptYWluLnBhZ2U9cmVhZF9odG1sKCJodHRwOi8vd3d3LnByZXNpZGVuY3kudWNzYi5lZHUvZmFyZXdlbGxfYWRkcmVzc2VzLnBocCIpCiMgR2V0IGxpbmsgVVJMcwpmYXJld2VsbCA8LSBmLnNwZWVjaGxpbmtzKG1haW4ucGFnZSkKCiMgcHJlcGFyZWQgQ1NWIGRhdGEgc2V0cyBmb3IgdGhlIHNwZWVjaGVzIHdlIHdpbGwgc2NyYXAuIAoKaW5hdWcubGlzdD1yZWFkLmNzdigiLi4vZGF0YS9pbmF1Z2xpc3QuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpub21pbi5saXN0PXJlYWQuY3N2KCIuLi9kYXRhL25vbWlubGlzdC5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmZhcmV3ZWxsLmxpc3Q9cmVhZC5jc3YoIi4uL2RhdGEvZmFyZXdlbGxsaXN0LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgV2UgYXNzZW1ibGUgYWxsIHNjcmFwcGVkIHNwZWVjaGVzIGludG8gb25lIGxpc3QuIE5vdGUgaGVyZSB0aGF0IHdlIGRvbid0IGhhdmUgdGhlIGZ1bGwgdGV4dCB5ZXQsIG9ubHkgdGhlIGxpbmtzIHRvIGZ1bGwgdGV4dCB0cmFuc2NyaXB0cy4gCgojIHNjcmFwIHRoZSB0ZXh0cyBvZiBzcGVlY2hlcyBmcm9tIHRoZSBzcGVlY2ggVVJMcy4KCm5vbWluPW5vbWluWy00NywgXQpzcGVlY2gubGlzdD1yYmluZChpbmF1Zy5saXN0LCBub21pbi5saXN0LCBmYXJld2VsbC5saXN0KQpzcGVlY2gubGlzdCR0eXBlPWMocmVwKCJpbmF1ZyIsIG5yb3coaW5hdWcubGlzdCkpLAogICAgICAgICAgICAgICAgICAgcmVwKCJub21pbiIsIG5yb3cobm9taW4ubGlzdCkpLAogICAgICAgICAgICAgICAgICAgcmVwKCJmYXJld2VsbCIsIG5yb3coZmFyZXdlbGwubGlzdCkpKQpzcGVlY2gudXJsPXJiaW5kKGluYXVnLCBub21pbiwgZmFyZXdlbGwpCnNwZWVjaC5saXN0PWNiaW5kKHNwZWVjaC5saXN0LCBzcGVlY2gudXJsKQoKIyBMb29wIG92ZXIgZWFjaCByb3cgaW4gc3BlZWNoLmxpc3QKc3BlZWNoLmxpc3QkZnVsbHRleHQ9TkEKZm9yKGkgaW4gc2VxKG5yb3coc3BlZWNoLmxpc3QpKSkgewogIHRleHQgPC0gcmVhZF9odG1sKHNwZWVjaC5saXN0JHVybHNbaV0pICU+JSAjIGxvYWQgdGhlIHBhZ2UKICAgIGh0bWxfbm9kZXMoIi5kaXNwbGF5dGV4dCIpICU+JSAjIGlzbG9hdGUgdGhlIHRleHQKICAgIGh0bWxfdGV4dCgpICMgZ2V0IHRoZSB0ZXh0CiAgc3BlZWNoLmxpc3QkZnVsbHRleHRbaV09dGV4dAogICMgQ3JlYXRlIHRoZSBmaWxlIG5hbWUKICBmaWxlbmFtZSA8LSBwYXN0ZTAoIi4uL2RhdGEvZnVsbHRleHQvIiwgCiAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JHR5cGVbaV0sCiAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JEZpbGVbaV0sICItIiwgCiAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JFRlcm1baV0sICIudHh0IikKICBzaW5rKGZpbGUgPSBmaWxlbmFtZSkgJT4lICMgb3BlbiBmaWxlIHRvIHdyaXRlIAogIGNhdCh0ZXh0KSAgIyB3cml0ZSB0aGUgZmlsZQogIHNpbmsoKSAjIGNsb3NlIHRoZSBmaWxlCn0KCiMgY29tYmluZSB0aGUgc3BlZWNoZXMgb2YgRG9uYWxkVHJ1bXAKc3BlZWNoMT1wYXN0ZShyZWFkTGluZXMoIi4uL2RhdGEvZnVsbHRleHQvU3BlZWNoRG9uYWxkVHJ1bXAtTkEudHh0IiwgCiAgICAgICAgICAgICAgICAgIG49LTEsIHNraXBOdWw9VFJVRSksCiAgICAgICAgICAgICAgY29sbGFwc2U9IiAiKQpzcGVlY2gyPXBhc3RlKHJlYWRMaW5lcygiLi4vZGF0YS9mdWxsdGV4dC9TcGVlY2hEb25hbGRUcnVtcC1OQTIudHh0IiwgCiAgICAgICAgICAgICAgICAgIG49LTEsIHNraXBOdWw9VFJVRSksCiAgICAgICAgICAgICAgY29sbGFwc2U9IiAiKQpzcGVlY2gzPXBhc3RlKHJlYWRMaW5lcygiLi4vZGF0YS9mdWxsdGV4dC9QcmVzc0RvbmFsZFRydW1wLU5BLnR4dCIsIAogICAgICAgICAgICAgICAgICBuPS0xLCBza2lwTnVsPVRSVUUpLAogICAgICAgICAgICAgIGNvbGxhcHNlPSIgIikKClRydW1wLnNwZWVjaGVzPWRhdGEuZnJhbWUoCiAgUHJlc2lkZW50PXJlcCgiRG9uYWxkIEouIFRydW1wIiwgMyksCiAgRmlsZT1yZXAoIkRvbmFsZEpUcnVtcCIsIDMpLAogIFRlcm09cmVwKDAsIDMpLAogIFBhcnR5PXJlcCgiUmVwdWJsaWNhbiIsIDMpLAogIERhdGU9YygiQXVndXN0IDMxLCAyMDE2IiwgIlNlcHRlbWJlciA3LCAyMDE2IiwgIkphbnVhcnkgMTEsIDIwMTciKSwKICBXb3Jkcz1jKHdvcmRfY291bnQoc3BlZWNoMSksIHdvcmRfY291bnQoc3BlZWNoMiksIHdvcmRfY291bnQoc3BlZWNoMykpLAogIFdpbj1yZXAoInllcyIsIDMpLAogIHR5cGU9cmVwKCJzcGVlY2hlcyIsIDMpLAogIGxpbmtzPXJlcChOQSwgMyksCiAgdXJscz1yZXAoTkEsIDMpLAogIGZ1bGx0ZXh0PWMoc3BlZWNoMSwgc3BlZWNoMiwgc3BlZWNoMykKKQoKc3BlZWNoLmxpc3Q9cmJpbmQoc3BlZWNoLmxpc3QsIFRydW1wLnNwZWVjaGVzKQoKZm9yIChpIGluIDE6bnJvdyhzcGVlY2gubGlzdCkpIHsKICBzcGVlY2gubGlzdFtpLDZdID0gd2Moc3BlZWNoLmxpc3RbaSwxMV0pCn0jIGNvdW50IHRoZSB3b3JkcyBmb3IgZWFjaCBzcGVlY2gKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBsb29rIGF0IHRoZSBkYXRhIHdlIGhhdmUKaGVhZChzcGVlY2gubGlzdCkKYGBgCgojIyMgQWJvdmUgaXMgdGhlIGRhdGFzZXQgd2UgY29uc3RydWN0ZWQsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaW5hdWd1cmFsIHNwZWVjaCBsaWtlIFBhcnR5LCBudW1iZXIgb2Ygd29yZHMsIGRhdGUgYW5kIHNvIG9uLgoKCiMgUGFydCAxOiBUaGUgc3Rvcnkgb2YgaW5hdWd1cmFsIHNwZWVjaGVzIG9mIERlbW9jcmF0aWMgUGFydHkgYW5kIFJlcHVibGljYW4gUGFydHkKCiMjIyBJdCBpcyB3ZWxsIGtub3duIHRoYXQgRGVtb2NyYXRzIGFuZCByZXB1YmxpY2FucyBoYXZlIGRpZmZlcmVudCBwbGF0Zm9ybXMsIGRldmVsb3BtZW50IGdvYWxzIGFuZCBkaWZmZXJlbnQgaW50ZXJlc3RzLiBTbyB3aGF0IGFyZSB0aGUgc2ltaWxhcml0aWVzIGFuZCBkaWZmZXJlbmNlcyBvZiB0aGVpciBzcGVlY2hlcz8KCiMjIDEuMSBUaGUgY2hhbmdlIG9mIG51bWJlciBvZiB3b3JkcyBvdmVyIHRpbWUKCmBgYHtyLCBlY2hvPUZBTFNFfQojIGxvb2sgYXQgdGhlIGNoYW5nZSBvZiBudW1iZXIgb2Ygd29yZHMgb3ZlciB0aW1lCmRlbS5zcGVlY2gubGlzdD1zdWJzZXQoc3BlZWNoLmxpc3QsIFBhcnR5PT0nRGVtb2NyYXRpYycpCnJlcC5zcGVlY2gubGlzdD1zdWJzZXQoc3BlZWNoLmxpc3QsIFBhcnR5PT0nUmVwdWJsaWNhbicpCgojIERlbW9jcmF0aWMgcHJlc2lkZW50cwpiYXJwbG90KGFzLmludGVnZXIoZGVtLnNwZWVjaC5saXN0JFdvcmRzKSwgeWxhYiA9ICdXb3JkcycsY29sID0gInBpbmsiLAptYWluID0gIk51bWJlciBvZiB3b3JkcyBvZiBEZW1vY3JhdGljIHByZXNpZGVudHMnIHNwZWVjaGVzIikKCiMgUmVwdWJsaWNhbiBwcmVzaWRlbnRzCmJhcnBsb3QoYXMuaW50ZWdlcihyZXAuc3BlZWNoLmxpc3QkV29yZHMpLCB5bGFiID0gJ1dvcmRzJyxjb2wgPSAibGlnaHQgYmx1ZSIsCm1haW4gPSAiTnVtYmVyIG9mIHdvcmRzIG9mIFJlcHVibGljYW4gcHJlc2lkZW50cycgc3BlZWNoZXMiKQpgYGAKCiMjIyBBY2NvcmRpbmcgdG8gdGhlIGJhcnBsb3QgYWJvdmUsIHdlIG1heSBzZWUgdGhhdDoKIyMjIEZvciBEZW1vY3JhdGljIHByZXNpZGVudHMnIHNwZWVjaGVzOgojIyMgKDEpIE1vc3Qgb2YgdGhlIHNwZWVjaGVzIGFyZSB1bmRlciA0MDAwIHdvcmRzLgojIyMgKDIpIFRoZSBudW1iZXIgb2Ygd29yZHMgZmx1Y3R1YXRlIG92ZXIgdGltZS4KIyMjICgzKSBBcyB0aW1lIGdvZXMgYnksIHRoZXJlIGlzIGEgc2xpZ2h0IHRyZW5kIHRoYXQgdGhlaXIgc3BlZWNoZXMgY29udGFpbiBtb3JlIGFuZCBtb3JlIHdvcmRzLgoKIyMjIEZvciBSZXB1YmxpY2FuIHByZXNpZGVudHMnIHNwZWVjaGVzOgojIyMgKDEpIE1vc3Qgb2YgdGhlIHNwZWVjaGVzIGFyZSB1bmRlciA1MDAwIHdvcmRzLgojIyMgKDIpIFRoZSBudW1iZXIgb2Ygd29yZHMgZmx1Y3R1YXRlIG92ZXIgdGltZS4KIyMjICgzKSBBcyB0aW1lIGdvZXMgYnksIHRoZXJlIGlzIGEgc2xpZ2h0IHRyZW5kIHRoYXQgdGhlaXIgc3BlZWNoZXMgY29udGFpbiBtb3JlIGFuZCBtb3JlIHdvcmRzLgoKIyMjIEl0IHNlZW1zIGxpa2UgdGhhdCB0aGUgd29yZCBhdmVyYWdlIG51bWJlciBvZiBSZXB1YmxpY2FuIHByZXNpZGVudHMnIHNwZWVjaGVzIGlzIG1vcmUgdGhhbiB0aGF0IG9mIERlbW9jcmF0aWMgcHJlc2lkZW50cycgc3BlZWNoZXMuIElzIGl0IHJpZ2h0PwoKYGBge3IsIGVjaG89RkFMU0V9CiMgY29tcGFyZSB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygd29yZHMgZnJvbSBkaWZmZXJlbnQgUGFydHkKZGF0YSA9IGMobWVhbihhcy5pbnRlZ2VyKGRlbS5zcGVlY2gubGlzdCRXb3JkcykpLCBtZWFuKGFzLmludGVnZXIocmVwLnNwZWVjaC5saXN0JFdvcmRzKSkpCm5hbWUgPSBjKCdEZW1vY3JhdGljJywgJ1JlcHVibGljYW4nKQpiYXJwbG90KGRhdGEsIG5hbWVzLmFyZyA9IG5hbWUsIHhsYWIgPSAnUGFydHknLCB5bGFiID0gJ0F2ZXJhZ2UgV29yZHMnLGNvbCA9ICJncmV5IiwKbWFpbiA9ICJBdmVyYWdlIG51bWJlciBvZiB3b3JkcyBvZiBwcmVzaWRlbnRzJyBzcGVlY2hlcyIpCmBgYAoKIyMjIEFjY29yZGluZyB0byB0aGUgZ3JhcGggYWJvdmUsIHdlIGNhbiBzZWUgdGhhdCB0aGUgYXZlcmFnZSB3b3JkIG51bWJlciBvZiBEZW1vY3JhdGljIHByZXNpZGVudHMnIHNwZWVjaGVzIGlzIGFib3V0IDMwMDAuIEFzIGZvciBSZXB1YmxpY2FuIHByZXNpZGVudHMnIHNwZWVjaGVzLCBpdCBpcyBhYm91dCAzNTAwLiBTbyB3ZSBoYXZlIHRoZSByaWdodCBndWVzcy4KCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGdlbmVyYXRlIGxpc3Qgb2Ygc2VudGVuY2VzCgpzZW50ZW5jZS5saXN0PU5VTEwKZm9yKGkgaW4gMTpucm93KHNwZWVjaC5saXN0KSl7CiAgc2VudGVuY2VzPXNlbnRfZGV0ZWN0KHNwZWVjaC5saXN0JGZ1bGx0ZXh0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICBlbmRtYXJrcyA9IGMoIj8iLCAiLiIsICIhIiwgInwiLCI7IikpCiAgaWYobGVuZ3RoKHNlbnRlbmNlcyk+MCl7CiAgICBlbW90aW9ucz1nZXRfbnJjX3NlbnRpbWVudChzZW50ZW5jZXMpCiAgICB3b3JkLmNvdW50PXdvcmRfY291bnQoc2VudGVuY2VzKQogICAgZW1vdGlvbnM9ZGlhZygxLyh3b3JkLmNvdW50KzAuMDEpKSUqJWFzLm1hdHJpeChlbW90aW9ucykKICAgIHNlbnRlbmNlLmxpc3Q9cmJpbmQoc2VudGVuY2UubGlzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHNwZWVjaC5saXN0W2ksLW5jb2woc3BlZWNoLmxpc3QpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGVuY2VzPWFzLmNoYXJhY3RlcihzZW50ZW5jZXMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQuaWQ9MTpsZW5ndGgoc2VudGVuY2VzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICApCiAgfQp9CgojIFNvbWUgbm9uLXNlbnRlbmNlcyBleGlzdCBpbiByYXcgZGF0YSBkdWUgdG8gZXJyb25lb3VzIGV4dHJhIGVuZC1vZi1zZW50ZW5jZSBtYXJrcy4gCnNlbnRlbmNlLmxpc3Q9CiAgc2VudGVuY2UubGlzdCU+JQogIGZpbHRlcighaXMubmEod29yZC5jb3VudCkpIApgYGAKCiMjIDEuMiBPdmVydmlldyBvZiBzZW50ZW5jZSBsZW5ndGggZGlzdHJpYnV0aW9uIGJ5IGRpZmZlcmVudCBQYXJ0eSBvZiBzcGVlY2hlcwoKIyMjIEZvciBzaW1wbGVyIHZpc3VhbGl6YXRpb24sIHdlIGNob3NlIGEgc3Vic2V0IG9mIGJldHRlciBrbm93biBwcmVzaWRlbnRzIG9yIHByZXNpZGVudGlhbCBjYW5kaWRhdGVzIG9uIHdoaWNoIHRvIGZvY3VzIG91ciBhbmFseXNpcy4gCgpgYGB7ciwgZWNobz1GQUxTRX0Kc2VsLmNvbXBhcmlzb249YygiRG9uYWxkSlRydW1wIiwiSm9obk1jQ2FpbiIsICJHZW9yZ2VCdXNoIiwgIk1pdHRSb21uZXkiLCAiR2VvcmdlV0J1c2giLAogICAgICAgICAgICAgICAgICJSb25hbGRSZWFnYW4iLCJBbGJlcnRHb3JlLEpyIiwgIkhpbGxhcnlDbGludG9uIiwiSm9obkZLZXJyeSIsIAogICAgICAgICAgICAgICAgICJXaWxsaWFtSkNsaW50b24iLCJIYXJyeVNUcnVtYW4iLCAiQmFyYWNrT2JhbWEiLCAiTHluZG9uQkpvaG5zb24iLAogICAgICAgICAgICAgICAgICJHZXJhbGRSRm9yZCIsICJKaW1teUNhcnRlciIsICJEd2lnaHRERWlzZW5ob3dlciIsICJGcmFua2xpbkRSb29zZXZlbHQiLAogICAgICAgICAgICAgICAgICJIZXJiZXJ0SG9vdmVyIiwiSm9obkZLZW5uZWR5IiwiUmljaGFyZE5peG9uIiwiV29vZHJvd1dpbHNvbiIsIAogICAgICAgICAgICAgICAgICJBYnJhaGFtTGluY29sbiIsICJUaGVvZG9yZVJvb3NldmVsdCIsICJKYW1lc0dhcmZpZWxkIiwgCiAgICAgICAgICAgICAgICAgIkpvaG5RdWluY3lBZGFtcyIsICJVbHlzc2VzU0dyYW50IiwgIlRob21hc0plZmZlcnNvbiIsCiAgICAgICAgICAgICAgICAgIkdlb3JnZVdhc2hpbmd0b24iLCAiV2lsbGlhbUhvd2FyZFRhZnQiLCAiQW5kcmV3SmFja3NvbiIsCiAgICAgICAgICAgICAgICAgIldpbGxpYW1IZW5yeUhhcnJpc29uIiwgIkpvaG5BZGFtcyIpCgpwcmludChzZWwuY29tcGFyaXNvbikKYGBgCgojIyMgVGhlc2UgYXJlIHRoZSBwcmVzaWRuZXRzIHdlIGNob3NlLgoKIyMjIEZvciByZWxldmFudCB0byBUcnVtcCdzIHNwZWVjaGVzLCB3ZSB3aWxsIG9ubHkgY29tcGFyZSBzcGVlY2hlcyBmb3IgdGhlIGZpcnN0IHRlcm1zIG9mIGZvcm1lciBVLlMuIHByZXNpZGVudHMuIAoKCiMjIDEuMi4xIERlbW9jcmF0aWMKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gMywgZWNobz1GQUxTRX0KCnBhcihtYXI9Yyg0LCAxMSwgMiwgMikpCgpzZW50ZW5jZS5saXN0LnNlbD1maWx0ZXIoc2VudGVuY2UubGlzdCwgUGFydHk9PSdEZW1vY3JhdGljJywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT09ImluYXVnIiwgVGVybT09MSwgRmlsZSVpbiVzZWwuY29tcGFyaXNvbikKc2VudGVuY2UubGlzdC5zZWwkRmlsZT1mYWN0b3Ioc2VudGVuY2UubGlzdC5zZWwkRmlsZSkKCnNlbnRlbmNlLmxpc3Quc2VsJEZpbGVPcmRlcmVkPXJlb3JkZXIoc2VudGVuY2UubGlzdC5zZWwkRmlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50ZW5jZS5saXN0LnNlbCR3b3JkLmNvdW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI9VCkKCmJlZXN3YXJtKHdvcmQuY291bnR+RmlsZU9yZGVyZWQsIAogICAgICAgICBkYXRhPXNlbnRlbmNlLmxpc3Quc2VsLAogICAgICAgICBob3Jpem9udGFsID0gVFJVRSwgCiAgICAgICAgIHBjaD0xNiwgY29sPWFscGhhKGJyZXdlci5wYWwoOSwgIlNldDEiKSwgMC42KSwgCiAgICAgICAgIGNleD0wLjU1LCBjZXguYXhpcz0wLjgsIGNleC5sYWI9MC44LAogICAgICAgICBzcGFjaW5nPTUvbmxldmVscyhzZW50ZW5jZS5saXN0LnNlbCRGaWxlT3JkZXJlZCksCiAgICAgICAgIGxhcz0yLCB4bGFiPSJOdW1iZXIgb2Ygd29yZHMgaW4gYSBzZW50ZW5jZS4iLCB5bGFiPSIiLAogICAgICAgICBtYWluPSJJbmF1Z3VyYWwgc3BlZWNoZXMiKQoKYGBgCgojIyMgV2UgbWF5IG5vdGljZSB0aGF0IG1vc3Qgb2YgdGhlaXIgc2VudGVuY2VzIGFyZSBiZXR3ZWVuIDEgYW5kIDMwIHdvcmRzLiBUaGUgZGlzdHJpYnV0aW9uIG9mIG51bWJlciBvZiB3b3JkcyBpbiBhIHNlbnRlbmNlIGlzIHJlbGF0aXZlbHkgc21vb3RoIGFuZCBhdmVyYWdlLgoKCiMjIDEuMi4yIFJlcHVibGljYW4KCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuaGVpZ2h0ID0gMywgZWNobz1GQUxTRX0KCnBhcihtYXI9Yyg0LCAxMSwgMiwgMikpCnNlbnRlbmNlLmxpc3Quc2VsPWZpbHRlcihzZW50ZW5jZS5saXN0LCBQYXJ0eT09J1JlcHVibGljYW4nLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlPT0iaW5hdWciLCBUZXJtPT0xLCBGaWxlJWluJXNlbC5jb21wYXJpc29uKQpzZW50ZW5jZS5saXN0LnNlbCRGaWxlPWZhY3RvcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlKQoKc2VudGVuY2UubGlzdC5zZWwkRmlsZU9yZGVyZWQ9cmVvcmRlcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRlbmNlLmxpc3Quc2VsJHdvcmQuY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcj1UKQoKYmVlc3dhcm0od29yZC5jb3VudH5GaWxlT3JkZXJlZCwgCiAgICAgICAgIGRhdGE9c2VudGVuY2UubGlzdC5zZWwsCiAgICAgICAgIGhvcml6b250YWwgPSBUUlVFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YWxwaGEoYnJld2VyLnBhbCg5LCAiU2V0MSIpLCAwLjYpLCAKICAgICAgICAgY2V4PTAuNTUsIGNleC5heGlzPTAuOCwgY2V4LmxhYj0wLjgsCiAgICAgICAgIHNwYWNpbmc9NS9ubGV2ZWxzKHNlbnRlbmNlLmxpc3Quc2VsJEZpbGVPcmRlcmVkKSwKICAgICAgICAgbGFzPTIsIHhsYWI9Ik51bWJlciBvZiB3b3JkcyBpbiBhIHNlbnRlbmNlLiIsIHlsYWI9IiIsCiAgICAgICAgIG1haW49IkluYXVndXJhbCBzcGVlY2hlcyIpCgpgYGAKIyMjIEFzIGZvciBSZXB1YmxpY2FuIHByZXNpZGVudHMsIHdlIGZpbmQgdGhhdCB0aGV5IGhhdmUgbW9yZSBzZW50ZW5jZXMgdW5kZXIgMjAgd29yZHMuIFNvIG1vc3Qgb2YgdGhlaXIgcG9pbnRzIGNvbmNlbnRyYXRlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdyYXBoLgoKCiMjIDEuMyBDbHVzdGVyaW5nIG9mIGVtb3Rpb25zCgpgYGB7ciwgZmlnLmhlaWdodD0zLjMsIGZpZy53aWR0aD0zLjcsIGVjaG89RkFMU0V9CnByZXNpZC5zdW1tYXJ5PXRibF9kZihzZW50ZW5jZS5saXN0KSU+JQogIGZpbHRlcih0eXBlPT0iaW5hdWciLCBGaWxlJWluJXNlbC5jb21wYXJpc29uKSU+JQogIGdyb3VwX2J5KEZpbGUpJT4lCiAgc3VtbWFyaXNlKAogICAgYW5nZXI9bWVhbihhbmdlciksCiAgICBhbnRpY2lwYXRpb249bWVhbihhbnRpY2lwYXRpb24pLAogICAgZGlzZ3VzdD1tZWFuKGRpc2d1c3QpLAogICAgZmVhcj1tZWFuKGZlYXIpLAogICAgam95PW1lYW4oam95KSwKICAgIHNhZG5lc3M9bWVhbihzYWRuZXNzKSwKICAgIHN1cnByaXNlPW1lYW4oc3VycHJpc2UpLAogICAgdHJ1c3Q9bWVhbih0cnVzdCksCiAgICBuZWdhdGl2ZT1tZWFuKG5lZ2F0aXZlKSwKICAgIHBvc2l0aXZlPW1lYW4ocG9zaXRpdmUpCiAgKQoKcHJlc2lkLnN1bW1hcnk9YXMuZGF0YS5mcmFtZShwcmVzaWQuc3VtbWFyeSkKcm93bmFtZXMocHJlc2lkLnN1bW1hcnkpPWFzLmNoYXJhY3RlcigocHJlc2lkLnN1bW1hcnlbLDFdKSkKa20ucmVzPWttZWFucyhwcmVzaWQuc3VtbWFyeVssLTFdLCBpdGVyLm1heD0yMDAsCiAgICAgICAgICAgICAgNSkKZnZpel9jbHVzdGVyKGttLnJlcywgCiAgICAgICAgICAgICBzdGFuZD1GLCByZXBlbD0gVFJVRSwKICAgICAgICAgICAgIGRhdGEgPSBwcmVzaWQuc3VtbWFyeVssLTFdLCB4bGFiPSIiLCB4YXh0PSJuIiwKICAgICAgICAgICAgIHNob3cuY2x1c3QuY2VudD1GQUxTRSkKYGBgCiMjIyBCeSBjbHVzdGVyaW5nIG9mIGVtb3Rpb25zIG9mIGFsbCB0aGVzZSBjaG9zZW4gc3BlZWNoZXMgZnJvbSBkaWZmZXJlbnQgUGFydHksIHdlIGNhbiBzZWUgdGhhdDoKIyMjICgxKSBUaGUgc3BlZWNoZXMgZnJvbSBkaWZmZXJlbnQgUGFydHkgbWF5IGJlIGluIHRoZSBzYW1lIGVtb3Rpb24gY2x1c3RlciwgbGlrZSBXaWxsaWFtIEhvd2FyZCBUYWZ0IGFuZCBCYXJhY2tPYmFtYS4KIyMjICgyKSBUaGUgc3BlZWNoZXMgZnJvbSB0aGUgc2FtZSBQYXJ0eSBtYXkgYmUgaW4gZGlmZmVyZW50IGVtb3Rpb24gY2x1c3RlciwgbGlrZSBGcmFua2xpbiBELiBSb29zZXZlbHQgYW5kIEJhcmFja09iYW1hLgoKIyMjIFdpdGggYWxsIHRoZSBmaW5kaW5nIHdlIGNvbmNsdWRlIGZyb20gcGFydCAxLCBuZXh0IHdlIHdpbGwgZm9jdXMgb24gdGhlIGRpZmZlcmVuY2Ugb2Ygc3BlZWNoZXMgYmV0d2VlbiBEb25hbGRKVHJ1bXAgYW5kIEJhcmFja09iYW1hLgoKCiMgUGFydCAyOiBUaGUgc3Rvcnkgb2YgaW5hdWd1cmFsIHNwZWVjaGVzIG9mIERvbmFsZEpUcnVtcCBhbmQgQmFyYWNrT2JhbWEKCiMjIyBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSBsb3RzIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gRG9uYWxkSlRydW1wIGFuZCBCYXJhY2tPYmFtYSwgYWdlcywgUGFydGllcywgZXhwZXJpZW5jZSBhbmQgc28gb24uIEhvdyBhYm91dCB0aGVpciBpbmF1Z3VyYWwgc3BlZWNoZXM/CgojIyAyLjEgT3ZlcnZpZXcgb2Ygc2VudGVuY2UgbGVuZ3RoIGRpc3RyaWJ1dGlvbgoKIyMjIEZvciByZWxldmFudCB0byBUcnVtcCdzIHNwZWVjaGVzLCB3ZSB3aWxsIG9ubHkgY29tcGFyZSBzcGVlY2hlcyBmb3IgdGhlIGZpcnN0IHRlcm1zIG9mIGZvcm1lciBVLlMuIHByZXNpZGVudHMuCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmhlaWdodCA9IDIsIGVjaG89RkFMU0V9CgpzZWwuY29tcGFyaXNvbjI9YygiRG9uYWxkSlRydW1wIiwgIkJhcmFja09iYW1hIikKCnBhcihtYXI9Yyg0LCAxMSwgMiwgMikpCgpzZW50ZW5jZS5saXN0LnNlbD1maWx0ZXIoc2VudGVuY2UubGlzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9PSJpbmF1ZyIsIFRlcm09PTEsIEZpbGUlaW4lc2VsLmNvbXBhcmlzb24yKQpzZW50ZW5jZS5saXN0LnNlbCRGaWxlPWZhY3RvcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlKQoKc2VudGVuY2UubGlzdC5zZWwkRmlsZU9yZGVyZWQ9cmVvcmRlcihzZW50ZW5jZS5saXN0LnNlbCRGaWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRlbmNlLmxpc3Quc2VsJHdvcmQuY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcj1UKQoKYmVlc3dhcm0od29yZC5jb3VudH5GaWxlT3JkZXJlZCwgCiAgICAgICAgIGRhdGE9c2VudGVuY2UubGlzdC5zZWwsCiAgICAgICAgIGhvcml6b250YWwgPSBUUlVFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YWxwaGEoYnJld2VyLnBhbCg5LCAiU2V0MSIpLCAwLjYpLCAKICAgICAgICAgY2V4PTAuNTUsIGNleC5heGlzPTAuOCwgY2V4LmxhYj0wLjgsCiAgICAgICAgIHNwYWNpbmc9NS9ubGV2ZWxzKHNlbnRlbmNlLmxpc3Quc2VsJEZpbGVPcmRlcmVkKSwKICAgICAgICAgbGFzPTIsIHhsYWI9Ik51bWJlciBvZiB3b3JkcyBpbiBhIHNlbnRlbmNlLiIsIHlsYWI9IiIsCiAgICAgICAgIG1haW49IkluYXVndXJhbCBzcGVlY2hlcyIpCgpgYGAKCiMjIyBJdCBpcyBvYnZpb3VzIHRoYXQgRG9uYWxkSlRydW1wIGhhcyBtb3JlIHNob3J0IHNlbnRlbmNlcyB0aGFuIEJhcmFja09iYW1hLiBCYXJhY2tPYmFtYSBoYXMgbG90cyBvZiBzZW50ZW5jZXMgd2l0aCBtb3JlIHRoYW4gMjUgd29yZHMuCgojIyMgU28gd2lsbCB0aGUgbnVtYmVyIG9mIHdvcmRzIGJlIGRpZmZlcmVudD8KCmBgYHtyLCBlY2hvPUZBTFNFfQojIGNvbXBhcmUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHNwZWVjaCBvZiBUcnVtcCBhbmQgT2JhbWEKd29yZD1jKG1lYW4oYXMuaW50ZWdlcihzcGVlY2gubGlzdFtzcGVlY2gubGlzdCRQcmVzaWRlbnQ9PSdEb25hbGQgSi4gVHJ1bXAnLCBdJFdvcmRzKSksIG1lYW4oYXMuaW50ZWdlcihzcGVlY2gubGlzdFtzcGVlY2gubGlzdCRQcmVzaWRlbnQ9PSdCYXJhY2sgT2JhbWEnLCBdJFdvcmRzKSkpCnByZT1jKCJEb25hbGRKVHJ1bXAiLCAiQmFyYWNrT2JhbWEiKQpiYXJwbG90KHdvcmQsIG5hbWVzLmFyZyA9IHByZSwgeGxhYiA9ICdQcmVzaWRlbnQnLCB5bGFiID0gJ0F2ZXJhZ2UgV29yZHMnLGNvbCA9ICJncmV5IiwKbWFpbiA9ICJOdW1iZXIgb2Ygd29yZHMgb2YgcHJlc2lkZW50cycgc3BlZWNoZXMiKQpgYGAKCiMjIyBBY2NvcmRpbmcgdG8gdGhlIGJhcnBsb3QgYWJvdmUsIHdlIGNhbiBmaW5kIHRoYXQgdGhlIHNwZWVjaGVzIG9mIERvbmFsZEpUcnVtcCBoYXMgYWJvdXQgNDMwMCB3b3Jkcy4gSG93ZXZlciwgdGhlIHNwZWVjaGVzIG9mIEJhcmFja09iYW1hIGhhcyBhYm91dCAzNjAwIHdvcmRzLCB3aGljaCBpcyBtdWNoIGxlc3MgdGhhbiBEb25hbGRKVHJ1bXAuCgoKIyMgMi4yIERvbmFsZEpUcnVtcCBWUyBCYXJhY2tPYmFtYSwgd2hhdCBhcmUgdGhlaXIgc2hvcnQgc2VudGVuY2VzPwoKYGBge3IsIGVjaG89RkFMU0V9CnNlbnRlbmNlLmxpc3QlPiUKICBmaWx0ZXIoRmlsZT09IkRvbmFsZEpUcnVtcCIsIAogICAgICAgICB0eXBlPT0iaW5hdWciLCAKICAgICAgICAgd29yZC5jb3VudDw9MyklPiUKICBzZWxlY3Qoc2VudGVuY2VzKQoKc2VudGVuY2UubGlzdCU+JQogIGZpbHRlcihGaWxlPT0iQmFyYWNrT2JhbWEiLCAKICAgICAgICAgdHlwZT09ImluYXVnIiwgCiAgICAgICAgIHdvcmQuY291bnQ8PTMpJT4lCiAgc2VsZWN0KHNlbnRlbmNlcykKYGBgCgojIyMgV2Ugd2lsbCBub3RpY2UgdGhhdCBtb3N0IG9mIHRoZWlyIHNob3J0IHNlbnRlbmNlcyBhcmUgc2ltaWxhciwgbGlrZSAnVGhhbmsgeW91Jy4gVGhlICdBbWVyaWNhIGZpcnN0JyBpbiBUcnVtcCdzIHNwZWVjaCBhbmQgdGhlICdkaXZlcnNpdHkgYW5kIG9wZW5uZXNzJyBpbiBPYmFtYSdzIHNwZWVjaCBzaG93IGEgYmlnIGRpZmZlcmVuY2UgaW4gdGhlaXIgY29uY2VwdCBvZiBydW5uaW5nIGEgY291bnRyeSwgZXNwZWNpYWxseSBpdHMgZXh0ZXJuYWwgYXR0aXR1ZGUuCgoKIyMgMi4zIFNlbnRpbWVudCBhbmFsc2lzCgojIyMgVGhlIGZvbGxvd2luZyBhbmFseXNpcyBzaG93cyB0aGF0IHNlbnRlbmNlIGxlbmd0aCB2YXJpYXRpb24gb3ZlciB0aGUgY291cnNlIG9mIHRoZSBzcGVlY2gsIHdpdGggZW1vdGlvbnMuIEhvdyB0aGUgcHJlc2lkZW50cyBhbHRlcm5hdGUgYmV0d2VlbiBsb25nIGFuZCBzaG9ydCBzZW50ZW5jZXMgYW5kIGhvdyB0aGV5IHNoaWZ0IGJldHdlZW4gZGlmZmVyZW50IHNlbnRpbWVudHMgaW4gdGhlaXIgc3BlZWNoZXMuIFdlIHVzZSB0aGUgc2FtZSBjb2xvciB0byBzaG93IHRoZSBzYW1lIGVtb3Rpb24uCgojIyAyLjMuMSBEb25hbGRKVHJ1bXAgVlMgQmFyYWNrT2JhbWEKCmBgYHtyLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0yLCBlY2hvPUZBTFNFfQpwYXIobWZyb3c9YygyLDEpLCBtYXI9YygxLDAsMiwwKSwgYnR5PSJuIiwgeGF4dD0ibiIsIHlheHQ9Im4iLCBmb250Lm1haW49MSkKCmYucGxvdHNlbnQubGVuKEluLmxpc3Q9c2VudGVuY2UubGlzdCwgSW5GaWxlPSJEb25hbGRKVHJ1bXAiLCAKICAgICAgICAgICAgICAgSW5UeXBlPSJpbmF1ZyIsIEluVGVybT0xLCBQcmVzaWRlbnQ9IkRvbmFsZCBUcnVtcCIpCgpmLnBsb3RzZW50LmxlbihJbi5saXN0PXNlbnRlbmNlLmxpc3QsIEluRmlsZT0iQmFyYWNrT2JhbWEiLCAKICAgICAgICAgICAgICAgSW5UeXBlPSJpbmF1ZyIsIEluVGVybT0xLCBQcmVzaWRlbnQ9IkJhcmFjayBPYmFtYSIpCgpgYGAKCiMjIyBJdCBpcyBvYnZpb3VzIHRoYXQgdGhlIGVtb3Rpb24gb2YgVHJ1bXAncyBzZW50ZW5jZXMgYXJlIG1vcmUgZWFzaWx5IGNoYW5nZWQuIE9uIGNvbnRyYWN0LCB0aGUgZW1vdGlvbiBvZiBPYmFtYSdzIHNlbnRlbmNlcyBhcmUgbW9yZSBjb2hlcmVuY2UuCgojIyMgV2hhdCBhcmUgdGhlIGVtb3Rpb25hbGx5IGNoYXJnZWQgc2VudGVuY2VzPwoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CnByaW50KCJEb25hbGQgVHJ1bXAiKQpzcGVlY2guZGY9dGJsX2RmKHNlbnRlbmNlLmxpc3QpJT4lCiAgZmlsdGVyKEZpbGU9PSJEb25hbGRKVHJ1bXAiLCB0eXBlPT0iaW5hdWciLCBUZXJtPT0xLCB3b3JkLmNvdW50Pj01KSU+JQogIHNlbGVjdChzZW50ZW5jZXMsIGFuZ2VyOnRydXN0KQpzcGVlY2guZGY9YXMuZGF0YS5mcmFtZShzcGVlY2guZGYpCmFzLmNoYXJhY3RlcihzcGVlY2guZGYkc2VudGVuY2VzW2FwcGx5KHNwZWVjaC5kZlssLTFdLCAyLCB3aGljaC5tYXgpXSkKCnByaW50KCJCYXJhY2sgT2JhbWEiKQpzcGVlY2guZGY9dGJsX2RmKHNlbnRlbmNlLmxpc3QpJT4lCiAgZmlsdGVyKEZpbGU9PSJCYXJhY2tPYmFtYSIsIHR5cGU9PSJpbmF1ZyIsIFRlcm09PTEsIHdvcmQuY291bnQ+PTUpJT4lCiAgc2VsZWN0KHNlbnRlbmNlcywgYW5nZXI6dHJ1c3QpCnNwZWVjaC5kZj1hcy5kYXRhLmZyYW1lKHNwZWVjaC5kZikKYXMuY2hhcmFjdGVyKHNwZWVjaC5kZiRzZW50ZW5jZXNbYXBwbHkoc3BlZWNoLmRmWywtMV0sIDIsIHdoaWNoLm1heCldKQpgYGAKCiMjIyBGcm9tIHRoZSByZXN1bHQgYWJvdmUsIHdlIG1heSBmaW5kIHRoYXQgdGhlIGNoYW5nZSBvZiBlbW90aW9uIGlzIGtpbmQgb2YgcmVsYXRlZCB0byB0aGUgY2hhbmdlIG9mIHRvcGljcywgbGlrZSAnVG9kYXkncyBjZXJlbW9ueSwgaG93ZXZlciwgaGFzIHZlcnkgc3BlY2lhbCBtZWFuaW5nLicgYnkgVHJ1bXAuCgoKIyMgMi40IFRvcGljIG1vZGVsaW5nCgojIyMgRm9yIHRvcGljIG1vZGVsaW5nLCB3ZSBwcmVwYXJlIGEgY29ycHVzIG9mIHNlbnRlbmNlIHNuaXBldHMgYXMgZm9sbG93cy4gRm9yIGVhY2ggc3BlZWNoLCB3ZSBzdGFydCB3aXRoIHNlbnRlbmNlcyBhbmQgcHJlcGFyZSBhIHNuaXBldCB3aXRoIGEgZ2l2ZW4gc2VudGVuY2Ugd2l0aCB0aGUgZmxhbmtpbmcgc2VudGVuY2VzLiAKCiMjIyBCYXNlZCBvbiB0aGUgbW9zdCBwb3B1bGFyIHRlcm1zIGFuZCB0aGUgbW9zdCBzYWxpZW50IHRlcm1zIGZvciBlYWNoIHRvcGljLCB3ZSBhc3NpZ24gYSBoYXNodGFnIHRvIGVhY2ggdG9waWMuIFRoZXNlIHRvcGljcyBhcmUgIkVjb25vbXkiLCAiQW1lcmljYSIsICJEZWZlbnNlIiwgIkJlbGllZiIsICJFbGVjdGlvbiIsICJQYXRyaW90aXNtIiwgIlVuaXR5IiwgIkdvdmVybm1lbnQiLCAiUmVmb3JtIiwgIlRlbXBvcmFsIiwgIldvcmtpbmdGYW1pbGllcyIsICJGcmVlZG9tIiwgIkVxdWFsaXR5IiwgIk1pc2MiIGFuZCAiTGVnaXNsYXRpb24iLgoKYGBge3IsIGVjaG89RkFMU0V9CmNvcnB1cy5saXN0PXNlbnRlbmNlLmxpc3RbMjoobnJvdyhzZW50ZW5jZS5saXN0KS0xKSwgXQpzZW50ZW5jZS5wcmU9c2VudGVuY2UubGlzdCRzZW50ZW5jZXNbMToobnJvdyhzZW50ZW5jZS5saXN0KS0yKV0Kc2VudGVuY2UucG9zdD1zZW50ZW5jZS5saXN0JHNlbnRlbmNlc1szOihucm93KHNlbnRlbmNlLmxpc3QpLTEpXQpjb3JwdXMubGlzdCRzbmlwZXRzPXBhc3RlKHNlbnRlbmNlLnByZSwgY29ycHVzLmxpc3Qkc2VudGVuY2VzLCBzZW50ZW5jZS5wb3N0LCBzZXA9IiAiKQpybS5yb3dzPSgxOm5yb3coY29ycHVzLmxpc3QpKVtjb3JwdXMubGlzdCRzZW50LmlkPT0xXQpybS5yb3dzPWMocm0ucm93cywgcm0ucm93cy0xKQpjb3JwdXMubGlzdD1jb3JwdXMubGlzdFstcm0ucm93cywgXQoKIyBUZXh0IG1pbmluZwpkb2NzIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoY29ycHVzLmxpc3Qkc25pcGV0cykpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKGRvY3NbW3NhbXBsZSgxOm5yb3coY29ycHVzLmxpc3QpLCAxKV1dKSkKCiMgVGV4dCBiYXNpYyBwcm9jZXNzaW5nLCBhZGFwdGVkIGZyb20gPGh0dHBzOi8vZWlnaHQybGF0ZS53b3JkcHJlc3MuY29tLzIwMTUvMDkvMjkvYS1nZW50bGUtaW50cm9kdWN0aW9uLXRvLXRvcGljLW1vZGVsaW5nLXVzaW5nLXIvPi4KI3JlbW92ZSBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBzeW1ib2xzCmRvY3MgPC10bV9tYXAoZG9jcyxjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQp3cml0ZUxpbmVzKGFzLmNoYXJhY3Rlcihkb2NzW1tzYW1wbGUoMTpucm93KGNvcnB1cy5saXN0KSwgMSldXSkpCgojcmVtb3ZlIHB1bmN0dWF0aW9uCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZVB1bmN0dWF0aW9uKQp3cml0ZUxpbmVzKGFzLmNoYXJhY3Rlcihkb2NzW1tzYW1wbGUoMTpucm93KGNvcnB1cy5saXN0KSwgMSldXSkpCgojU3RyaXAgZGlnaXRzCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZU51bWJlcnMpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKGRvY3NbW3NhbXBsZSgxOm5yb3coY29ycHVzLmxpc3QpLCAxKV1dKSkKCiNyZW1vdmUgc3RvcHdvcmRzCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoImVuZ2xpc2giKSkKd3JpdGVMaW5lcyhhcy5jaGFyYWN0ZXIoZG9jc1tbc2FtcGxlKDE6bnJvdyhjb3JwdXMubGlzdCksIDEpXV0pKQoKI3JlbW92ZSB3aGl0ZXNwYWNlCmRvY3MgPC0gdG1fbWFwKGRvY3MsIHN0cmlwV2hpdGVzcGFjZSkKd3JpdGVMaW5lcyhhcy5jaGFyYWN0ZXIoZG9jc1tbc2FtcGxlKDE6bnJvdyhjb3JwdXMubGlzdCksIDEpXV0pKQoKI1N0ZW0gZG9jdW1lbnQKZG9jcyA8LSB0bV9tYXAoZG9jcyxzdGVtRG9jdW1lbnQpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKGRvY3NbW3NhbXBsZSgxOm5yb3coY29ycHVzLmxpc3QpLCAxKV1dKSkKCiNHZW5nZXJhdGUgZG9jdW1lbnQtdGVybSBtYXRyaWNlcy4gCmR0bSA8LSBEb2N1bWVudFRlcm1NYXRyaXgoZG9jcykKI2NvbnZlcnQgcm93bmFtZXMgdG8gZmlsZW5hbWVzI2NvbnZlcnQgcm93bmFtZXMgdG8gZmlsZW5hbWVzCnJvd25hbWVzKGR0bSkgPC0gcGFzdGUoY29ycHVzLmxpc3QkdHlwZSwgY29ycHVzLmxpc3QkRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb3JwdXMubGlzdCRUZXJtLCBjb3JwdXMubGlzdCRzZW50LmlkLCBzZXA9Il8iKQoKcm93VG90YWxzIDwtIGFwcGx5KGR0bSAsIDEsIHN1bSkgI0ZpbmQgdGhlIHN1bSBvZiB3b3JkcyBpbiBlYWNoIERvY3VtZW50CgpkdG0gIDwtIGR0bVtyb3dUb3RhbHM+IDAsIF0KY29ycHVzLmxpc3Q9Y29ycHVzLmxpc3Rbcm93VG90YWxzPjAsIF0KCiNSdW4gTERBCiNTZXQgcGFyYW1ldGVycyBmb3IgR2liYnMgc2FtcGxpbmcKYnVybmluIDwtIDQwMDAKaXRlciA8LSAyMDAwCnRoaW4gPC0gNTAwCnNlZWQgPC1saXN0KDIwMDMsNSw2MywxMDAwMDEsNzY1KQpuc3RhcnQgPC0gNQpiZXN0IDwtIFRSVUUKCiNOdW1iZXIgb2YgdG9waWNzCmsgPC0gMTUKCiNSdW4gTERBIHVzaW5nIEdpYmJzIHNhbXBsaW5nCmxkYU91dCA8LUxEQShkdG0sIGssIG1ldGhvZD0iR2liYnMiLCBjb250cm9sPWxpc3QobnN0YXJ0PW5zdGFydCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gc2VlZCwgYmVzdD1iZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVybmluID0gYnVybmluLCBpdGVyID0gaXRlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluPXRoaW4pKQojd3JpdGUgb3V0IHJlc3VsdHMKI2RvY3MgdG8gdG9waWNzCmxkYU91dC50b3BpY3MgPC0gYXMubWF0cml4KHRvcGljcyhsZGFPdXQpKQp0YWJsZShjKDE6aywgbGRhT3V0LnRvcGljcykpCndyaXRlLmNzdihsZGFPdXQudG9waWNzLGZpbGU9cGFzdGUoIi4uL291dHB1dC9MREFHaWJicyIsaywiRG9jc1RvVG9waWNzLmNzdiIpKQoKI3RvcCA2IHRlcm1zIGluIGVhY2ggdG9waWMKbGRhT3V0LnRlcm1zIDwtIGFzLm1hdHJpeCh0ZXJtcyhsZGFPdXQsMjApKQp3cml0ZS5jc3YobGRhT3V0LnRlcm1zLGZpbGU9cGFzdGUoIi4uL291dHB1dC9MREFHaWJicyIsaywiVG9waWNzVG9UZXJtcy5jc3YiKSkKCiNwcm9iYWJpbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRvcGljIGFzc2lnbm1lbnQKdG9waWNQcm9iYWJpbGl0aWVzIDwtIGFzLmRhdGEuZnJhbWUobGRhT3V0QGdhbW1hKQp3cml0ZS5jc3YodG9waWNQcm9iYWJpbGl0aWVzLGZpbGU9cGFzdGUoIi4uL291dHB1dC9MREFHaWJicyIsaywiVG9waWNQcm9iYWJpbGl0aWVzLmNzdiIpKQoKdGVybXMuYmV0YT1sZGFPdXRAYmV0YQp0ZXJtcy5iZXRhPXNjYWxlKHRlcm1zLmJldGEpCnRvcGljcy50ZXJtcz1OVUxMCmZvcihpIGluIDE6ayl7CiAgdG9waWNzLnRlcm1zPXJiaW5kKHRvcGljcy50ZXJtcywgbGRhT3V0QHRlcm1zW29yZGVyKHRlcm1zLmJldGFbaSxdLCBkZWNyZWFzaW5nID0gVFJVRSlbMTo3XV0pCn0KdG9waWNzLnRlcm1zCmxkYU91dC50ZXJtcwoKdG9waWNzLmhhc2g9YygiRWNvbm9teSIsICJBbWVyaWNhIiwgIkRlZmVuc2UiLCAiQmVsaWVmIiwgIkVsZWN0aW9uIiwgIlBhdHJpb3Rpc20iLCAiVW5pdHkiLCAiR292ZXJubWVudCIsICJSZWZvcm0iLCAiVGVtcG9yYWwiLCAiV29ya2luZ0ZhbWlsaWVzIiwgIkZyZWVkb20iLCAiRXF1YWxpdHkiLCAiTWlzYyIsICJMZWdpc2xhdGlvbiIpCmNvcnB1cy5saXN0JGxkYXRvcGljPWFzLnZlY3RvcihsZGFPdXQudG9waWNzKQpjb3JwdXMubGlzdCRsZGFoYXNoPXRvcGljcy5oYXNoW2xkYU91dC50b3BpY3NdCgpjb2xuYW1lcyh0b3BpY1Byb2JhYmlsaXRpZXMpPXRvcGljcy5oYXNoCmNvcnB1cy5saXN0LmRmPWNiaW5kKGNvcnB1cy5saXN0LCB0b3BpY1Byb2JhYmlsaXRpZXMpCmBgYAoKCiMjIDIuNC4xIFRvcGljcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIFRydW1wIGFuZCBPYmFtYQoKYGBge3IsIGZpZy53aWR0aD0zLjMsIGZpZy5oZWlnaHQ9MywgZWNobz1GQUxTRX0KIyBbMV0gIkVjb25vbXkiICAgICAgICAgIkFtZXJpY2EiICAgICAgICAgIkRlZmVuc2UiICAgICAgICAgIkJlbGllZiIgICAgICAgICAKIyBbNV0gIkVsZWN0aW9uIiAgICAgICAgIlBhdHJpb3Rpc20iICAgICAgIlVuaXR5IiAgICAgICAgICAgIkdvdmVybm1lbnQiICAgICAKIyBbOV0gIlJlZm9ybSIgICAgICAgICAgIlRlbXBvcmFsIiAgICAgICAgIldvcmtpbmdGYW1pbGllcyIgIkZyZWVkb20iICAgICAgICAKIyBbMTNdICJFcXVhbGl0eSIgICAgICAgICJNaXNjIiAgICAgICAgICAgICJMZWdpc2xhdGlvbiIgICAgICAgCgpwYXIobWZyb3c9YygyLCAxKSwgbWFyPWMoMSwxLDIsMCksIGJ0eT0ibiIsIHhheHQ9Im4iLCB5YXh0PSJuIikKCnRvcGljLnBsb3Q9YygxOjE1KQpwcmludCh0b3BpY3MuaGFzaFt0b3BpYy5wbG90XSkKIApzcGVlY2guZGY9dGJsX2RmKGNvcnB1cy5saXN0LmRmKSU+JWZpbHRlcihGaWxlPT0iRG9uYWxkSlRydW1wIiwgdHlwZT09ImluYXVnIiklPiVzZWxlY3Qoc2VudC5pZCwgRWNvbm9teTpMZWdpc2xhdGlvbikKc3BlZWNoLmRmPWFzLm1hdHJpeChzcGVlY2guZGYpCnNwZWVjaC5kZlssLTFdPXJlcGxhY2Uoc3BlZWNoLmRmWywtMV0sIHNwZWVjaC5kZlssLTFdPDEvMTUsIDAuMDAxKQpzcGVlY2guZGZbLC0xXT1mLnNtb290aC50b3BpYyh4PXNwZWVjaC5kZlssMV0sIHk9c3BlZWNoLmRmWywtMV0pCnBsb3Quc3RhY2tlZChzcGVlY2guZGZbLDFdLCBzcGVlY2guZGZbLHRvcGljLnBsb3QrMV0sCiAgICAgICAgICAgIHhsYWI9IlNlbnRlbmNlcyIsIHlsYWI9IlRvcGljIHNoYXJlIiwgbWFpbj0iRG9uYWxkIFRydW1wLCAgSW5hdWd1cmFsIFNwZWVjaGVzIikKCnNwZWVjaC5kZj10YmxfZGYoY29ycHVzLmxpc3QuZGYpJT4lZmlsdGVyKEZpbGU9PSJCYXJhY2tPYmFtYSIsIHR5cGU9PSJpbmF1ZyIsIFRlcm09PTEpJT4lc2VsZWN0KHNlbnQuaWQsIEVjb25vbXk6TGVnaXNsYXRpb24pCnNwZWVjaC5kZj1hcy5tYXRyaXgoc3BlZWNoLmRmKQpzcGVlY2guZGZbLC0xXT1yZXBsYWNlKHNwZWVjaC5kZlssLTFdLCBzcGVlY2guZGZbLC0xXTwxLzE1LCAwLjAwMSkKc3BlZWNoLmRmWywtMV09Zi5zbW9vdGgudG9waWMoeD1zcGVlY2guZGZbLDFdLCB5PXNwZWVjaC5kZlssLTFdKQpwbG90LnN0YWNrZWQoc3BlZWNoLmRmWywxXSwgc3BlZWNoLmRmWyx0b3BpYy5wbG90KzFdLAogICAgICAgICAgICAgeGxhYj0iU2VudGVuY2VzIiwgeWxhYj0iVG9waWMgc2hhcmUiLCBtYWluPSJCYXJhY2sgT2JhbWEsIEluYXVndXJhbCBTcGVlY2hlcyIpCmBgYAoKIyMjIEFjY29yZGluZyB0byB0aGUgcmVzdWx0LCB3ZSBtYXkgZmluZCB0aGF0OgojIyMgKDEpIEZvciBEb25hbGRKVHJ1bXAsIGEgYmlnIHBhcnQgb2YgaGlzIHNwZWVjaCBpcyByZWxhdGVkIHRvIGxlZ2lzbGF0aW9uLCBlcXVhbGl0eSwgZGVmZW5zZSBhbmQgQW1lcmljYS4KIyMjICgxKSBGb3IgQmFyYWNrT2JhbWEsIGl0IGlzIGVxdWFsaXR5LCBmcmVlZG9tLCBnb3Zlcm5tZW50IGFuZCBBbWVyaWNhLgoKCiMjIDIuNC4yIEhvdyBhcmUgdGhlIHNlbnRlbmNlcyByZWxhdGVkIHRvIHRvcGljcz8KCmBgYHtyLCBlY2hvPUZBTFNFfQpzcGVlY2guZGY9dGJsX2RmKGNvcnB1cy5saXN0LmRmKSU+JWZpbHRlcih0eXBlPT0iaW5hdWciLCB3b3JkLmNvdW50PDIwKSU+JXNlbGVjdChzZW50ZW5jZXMsIEVjb25vbXk6TGVnaXNsYXRpb24pCgphcy5jaGFyYWN0ZXIoc3BlZWNoLmRmJHNlbnRlbmNlc1thcHBseShhcy5kYXRhLmZyYW1lKHNwZWVjaC5kZlssLTFdKSwgMiwgd2hpY2gubWF4KV0pCgpuYW1lcyhzcGVlY2guZGYpWy0xXQpgYGAKCiMjIyBGcm9tIHRoZSByZXN1bHQgYWJvdmUsIHdlIGNhbiBjbGVhcmx5IHNlZSBob3cgdG9waWMgbW9kZWxpbmcgd29yay4KCgojIENvbmNsdXNpb24KCiMjIyBJbiBjb25jbHVzaW9uLCBmcm9tIHRoZXNlIGFuYWx5c2lzLCB3ZSBtYXkgZmluZCBhIGxvdCBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBpbmF1Z3VyYWwgc3BlZWNoIG9mIERlbW9jcmF0aWMgUGFydHkgYW5kIFJlcHVibGljYW4gUGFydHksIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBzZW50ZW5jZSBkaXN0cmlidXRpb24sIGVtb3Rpb24gY2x1c3RlciBhbmQgc28gb24uCgojIyMgU28gYXMgdG8gRG9uYWxkSlRydW1wIGZyb20gUmVwdWJsaWNhbiBQYXJ0eSBhbmQgQmFyYWNrT2JhbWEgZnJvbSBEZW1vY3JhdGljIFBhcnR5LCB0aGV5IGhhdmUgbG90cyBvZiBkaWZmZXJlbmNlcyBpbiB0aGVpciBzcGVlY2gncyBwYXR0ZXJuLCBsaWtlIHNlbnRpbWVudCBkaWZmZXJlbmNlLCB0b3BpYyBkaWZmZXJlbmNlIGFuZCBzbyBvbi4KCiMgUmVmZXJlbmNlCgojIyMgd2syLVR1dG9yaWFsLVRleHRNaW5pbmcgaHR0cHM6Ly9naXRodWIuY29tL1Rac3RhdHNBRFMvQURTX1RlYWNoaW5nL3RyZWUvbWFzdGVyL1R1dG9yaWFscy93azItVGV4dE1pbmluZwo=